#include <stdlib.h>

#ifndef __LNKLIST_H_
#define __LNKLIST_H_

typedef int (*cmp_t)(const void *data, const void *key);

typedef void (*pri_t)(const void *data);

typedef struct node_st {
	void *data;
	struct node_st *next;
} node_t;

typedef struct listhead_st {
	node_t node;
	int size;
} list_t;

int listhead_init(list_t **li, int size);

int list_empty(const list_t *li);

int list_insert_head(list_t *li, const void *data);

int list_insert_tail(list_t *li, const void *data);

void *list_find(const list_t *li, const void *key, cmp_t cmp);

int list_delete(list_t *li, const void *key, cmp_t cmp);

void list_travel(const list_t *li, pri_t pri);

void list_destroy(list_t **li);

// Extra

void *list_middle(list_t *li);

void list_reverse(list_t *li);

#endif
